#include <stdlib.h>
#include "stm32f10x.h"

#define BootRAM 0xF1E0F85F
#define WEAK    __attribute__ ((weak))

typedef void ( *const intfunc )(void);

/* provided by the linker script */
extern unsigned long _user_stack_start; /* 栈底的地址 */

extern void Reset_Handler(void) __attribute__((__interrupt__));

static void Default_Handler(void);

void WEAK NMI_Handler(void);
void WEAK HardFault_Handler(void);
void WEAK MemManage_Handler(void);
void WEAK BusFault_Handler(void);
void WEAK UsageFault_Handler(void);
void WEAK SVC_Handler(void);
void WEAK DebugMon_Handler(void);
void WEAK PendSV_Handler(void);
void WEAK SysTick_Handler(void);
void WEAK WWDG_IRQHandler(void);
void WEAK PVD_IRQHandler(void);
void WEAK TAMPER_IRQHandler(void);
void WEAK RTC_IRQHandler(void);
void WEAK FLASH_IRQHandler(void);
void WEAK RCC_IRQHandler(void);
void WEAK EXTI0_IRQHandler(void);
void WEAK EXTI1_IRQHandler(void);
void WEAK EXTI2_IRQHandler(void);
void WEAK EXTI3_IRQHandler(void);
void WEAK EXTI4_IRQHandler(void);
void WEAK DMA1_Channel1_IRQHandler(void);
void WEAK DMA1_Channel2_IRQHandler(void);
void WEAK DMA1_Channel3_IRQHandler(void);
void WEAK DMA1_Channel4_IRQHandler(void);
void WEAK DMA1_Channel5_IRQHandler(void);
void WEAK DMA1_Channel6_IRQHandler(void);
void WEAK DMA1_Channel7_IRQHandler(void);
void WEAK ADC1_2_IRQHandler(void);
void WEAK USB_HP_CAN1_TX_IRQHandler(void);
void WEAK USB_LP_CAN1_RX0_IRQHandler(void);
void WEAK CAN1_RX1_IRQHandler(void);
void WEAK CAN1_SCE_IRQHandler(void);
void WEAK EXTI9_5_IRQHandler(void);
void WEAK TIM1_BRK_IRQHandler(void);
void WEAK TIM1_UP_IRQHandler(void);
void WEAK TIM1_TRG_COM_IRQHandler(void);
void WEAK TIM1_CC_IRQHandler(void);
void WEAK TIM2_IRQHandler(void);
void WEAK TIM3_IRQHandler(void);
void WEAK TIM4_IRQHandler(void);
void WEAK I2C1_EV_IRQHandler(void);
void WEAK I2C1_ER_IRQHandler(void);
void WEAK I2C2_EV_IRQHandler(void);
void WEAK I2C2_ER_IRQHandler(void);
void WEAK SPI1_IRQHandler(void);
void WEAK SPI2_IRQHandler(void);
void WEAK USART1_IRQHandler(void);
void WEAK USART2_IRQHandler(void);
void WEAK USART3_IRQHandler(void);
void WEAK EXTI15_10_IRQHandler(void);
void WEAK RTCAlarm_IRQHandler(void);
void WEAK USBWakeUp_IRQHandler(void);
void WEAK TIM8_BRK_IRQHandler(void);
void WEAK TIM8_UP_IRQHandler(void);
void WEAK TIM8_TRG_COM_IRQHandler(void);
void WEAK TIM8_CC_IRQHandler(void);
void WEAK ADC3_IRQHandler(void);
void WEAK FSMC_IRQHandler(void);
void WEAK SDIO_IRQHandler(void);
void WEAK TIM5_IRQHandler(void);
void WEAK SPI3_IRQHandler(void);
void WEAK UART4_IRQHandler(void);
void WEAK UART5_IRQHandler(void);
void WEAK TIM6_IRQHandler(void);
void WEAK TIM7_IRQHandler(void);
void WEAK DMA2_Channel1_IRQHandler(void);
void WEAK DMA2_Channel2_IRQHandler(void);
void WEAK DMA2_Channel3_IRQHandler(void);
void WEAK DMA2_Channel4_5_IRQHandler(void);

__attribute__ ((section(".isr_vectors"))) intfunc g_pfnVectors[] = {
    /* The stack pointer after relocation */
    (intfunc)((unsigned long)&_user_stack_start),

    Reset_Handler,                  /* Reset Handler */
    NMI_Handler,                    /* NMI Handler */
    HardFault_Handler,              /* Hard Fault Handler */
    MemManage_Handler,              /* MPU Fault Handler */
    BusFault_Handler,               /* Bus Fault Handler */
    UsageFault_Handler,             /* Usage Fault Handler */
    0,                              /* Reserved */
    0,                              /* Reserved */
    0,                              /* Reserved */
    0,                              /* Reserved */
    SVC_Handler,                    /* SVCall Handler */
    DebugMon_Handler,               /* Debug Monitor Handler */
    0,                              /* Reserved */
    PendSV_Handler,                 /* PendSV Handler */
    SysTick_Handler,                /* SysTick Handler */

    /* External Interrupts */

    WWDG_IRQHandler,                /* Window Watchdog */
    PVD_IRQHandler,                 /* PVD through EXTI Line detect */
    TAMPER_IRQHandler,              /* Tamper */
    RTC_IRQHandler,                 /* RTC */
    FLASH_IRQHandler,               /* Flash */
    RCC_IRQHandler,                 /* RCC */
    EXTI0_IRQHandler,               /* EXTI Line 0 */
    EXTI1_IRQHandler,               /* EXTI Line 1 */
    EXTI2_IRQHandler,               /* EXTI Line 2 */
    EXTI3_IRQHandler,               /* EXTI Line 3 */
    EXTI4_IRQHandler,               /* EXTI Line 4 */
    DMA1_Channel1_IRQHandler,       /* DMA1 Channel 1 */
    DMA1_Channel2_IRQHandler,       /* DMA1 Channel 2 */
    DMA1_Channel3_IRQHandler,       /* DMA1 Channel 3 */
    DMA1_Channel4_IRQHandler,       /* DMA1 Channel 4 */
    DMA1_Channel5_IRQHandler,       /* DMA1 Channel 5 */
    DMA1_Channel6_IRQHandler,       /* DMA1 Channel 6 */
    DMA1_Channel7_IRQHandler,       /* DMA1 Channel 7 */
    ADC1_2_IRQHandler,              /* ADC1 & ADC2 */
    USB_HP_CAN1_TX_IRQHandler,      /* USB High Priority or CAN1 TX */
    USB_LP_CAN1_RX0_IRQHandler,     /* USB Low Priority or CAN1 RX0 */
    CAN1_RX1_IRQHandler,            /* CAN1 RX1 */
    CAN1_SCE_IRQHandler,            /* CAN1 SCE */
    EXTI9_5_IRQHandler,             /* EXTI Line 9..5 */
    TIM1_BRK_IRQHandler,            /* TIM1 Break */
    TIM1_UP_IRQHandler,             /* TIM1 Update */
    TIM1_TRG_COM_IRQHandler,        /* TIM1 Trigger and Commutation */
    TIM1_CC_IRQHandler,             /* TIM1 Capture Compare */
    TIM2_IRQHandler,                /* TIM2 */
    TIM3_IRQHandler,                /* TIM3 */
    TIM4_IRQHandler,                /* TIM4 */
    I2C1_EV_IRQHandler,             /* I2C1 Event */
    I2C1_ER_IRQHandler,             /* I2C1 Error */
    I2C2_EV_IRQHandler,             /* I2C2 Event */
    I2C2_ER_IRQHandler,             /* I2C2 Error */
    SPI1_IRQHandler,                /* SPI1 */
    SPI2_IRQHandler,                /* SPI2 */
    USART1_IRQHandler,              /* USART1 */
    USART2_IRQHandler,              /* USART2 */
    USART3_IRQHandler,              /* USART3 */
    EXTI15_10_IRQHandler,           /* EXTI Line 15..10 */
    RTCAlarm_IRQHandler,            /* RTC Alarm through EXTI Line */
    USBWakeUp_IRQHandler,           /* USB Wakeup from suspend */
    TIM8_BRK_IRQHandler,
    TIM8_UP_IRQHandler,
    TIM8_TRG_COM_IRQHandler,
    TIM8_CC_IRQHandler,
    ADC3_IRQHandler,
    FSMC_IRQHandler,
    SDIO_IRQHandler,
    TIM5_IRQHandler,
    SPI3_IRQHandler,
    UART4_IRQHandler,
    UART5_IRQHandler,
    TIM6_IRQHandler,
    TIM7_IRQHandler,
    DMA2_Channel1_IRQHandler,
    DMA2_Channel2_IRQHandler,
    DMA2_Channel3_IRQHandler,
    DMA2_Channel4_5_IRQHandler,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0,

 /* @0x1E0. This is for boot in RAM mode for STM32F10x High Density devices. */
    (intfunc) BootRAM
};

#pragma weak MMI_Handler                = Default_Handler
#pragma weak MemManage_Handler          = Default_Handler
#pragma weak BusFault_Handler           = Default_Handler
#pragma weak UsageFault_Handler         = Default_Handler
#pragma weak SVC_Handler                = Default_Handler
#pragma weak DebugMon_Handler           = Default_Handler
#pragma weak PendSV_Handler             = Default_Handler
#pragma weak SysTick_Handler            = Default_Handler
#pragma weak WWDG_IRQHandler            = Default_Handler
#pragma weak PVD_IRQHandler             = Default_Handler
#pragma weak TAMPER_IRQHandler          = Default_Handler
#pragma weak RTC_IRQHandler             = Default_Handler
#pragma weak FLASH_IRQHandler           = Default_Handler
#pragma weak RCC_IRQHandler             = Default_Handler
#pragma weak EXTI0_IRQHandler           = Default_Handler
#pragma weak EXTI1_IRQHandler           = Default_Handler
#pragma weak EXTI2_IRQHandler           = Default_Handler
#pragma weak EXTI3_IRQHandler           = Default_Handler
#pragma weak EXTI4_IRQHandler           = Default_Handler
#pragma weak DMA1_Channel1_IRQHandler   = Default_Handler
#pragma weak DMA1_Channel2_IRQHandler   = Default_Handler
#pragma weak DMA1_Channel3_IRQHandler   = Default_Handler
#pragma weak DMA1_Channel4_IRQHandler   = Default_Handler
#pragma weak DMA1_Channel5_IRQHandler   = Default_Handler
#pragma weak DMA1_Channel6_IRQHandler   = Default_Handler
#pragma weak DMA1_Channel7_IRQHandler   = Default_Handler
#pragma weak ADC1_2_IRQHandler          = Default_Handler
#pragma weak USB_HP_CAN1_TX_IRQHandler  = Default_Handler
#pragma weak USB_LP_CAN1_RX0_IRQHandler = Default_Handler
#pragma weak CAN1_RX1_IRQHandler        = Default_Handler
#pragma weak CAN1_SCE_IRQHandler        = Default_Handler
#pragma weak EXTI9_5_IRQHandler         = Default_Handler
#pragma weak TIM1_BRK_IRQHandler        = Default_Handler
#pragma weak TIM1_UP_IRQHandler         = Default_Handler
#pragma weak TIM1_TRG_COM_IRQHandler    = Default_Handler
#pragma weak TIM1_CC_IRQHandler         = Default_Handler
#pragma weak TIM2_IRQHandler            = Default_Handler
#pragma weak TIM3_IRQHandler            = Default_Handler
#pragma weak TIM4_IRQHandler            = Default_Handler
#pragma weak I2C1_EV_IRQHandler         = Default_Handler
#pragma weak I2C1_ER_IRQHandler         = Default_Handler
#pragma weak I2C2_EV_IRQHandler         = Default_Handler
#pragma weak I2C2_ER_IRQHandler         = Default_Handler
#pragma weak SPI1_IRQHandler            = Default_Handler
#pragma weak SPI2_IRQHandler            = Default_Handler
#pragma weak USART1_IRQHandler          = Default_Handler
#pragma weak USART2_IRQHandler          = Default_Handler
#pragma weak USART3_IRQHandler          = Default_Handler
#pragma weak EXTI15_10_IRQHandler       = Default_Handler
#pragma weak RTCAlarm_IRQHandler        = Default_Handler
#pragma weak USBWakeUp_IRQHandler       = Default_Handler
#pragma weak TIM8_BRK_IRQHandler        = Default_Handler
#pragma weak TIM8_UP_IRQHandler         = Default_Handler
#pragma weak TIM8_TRG_COM_IRQHandler    = Default_Handler
#pragma weak TIM8_CC_IRQHandler         = Default_Handler
#pragma weak ADC3_IRQHandler            = Default_Handler
#pragma weak FSMC_IRQHandler            = Default_Handler
#pragma weak SDIO_IRQHandler            = Default_Handler
#pragma weak TIM5_IRQHandler            = Default_Handler
#pragma weak SPI3_IRQHandler            = Default_Handler
#pragma weak UART4_IRQHandler           = Default_Handler
#pragma weak UART5_IRQHandler           = Default_Handler
#pragma weak TIM6_IRQHandler            = Default_Handler
#pragma weak TIM7_IRQHandler            = Default_Handler
#pragma weak DMA2_Channel1_IRQHandler   = Default_Handler
#pragma weak DMA2_Channel2_IRQHandler   = Default_Handler
#pragma weak DMA2_Channel3_IRQHandler   = Default_Handler
#pragma weak DMA2_Channel4_5_IRQHandler = Default_Handler

static void Default_Handler(void)
{
while (1) {}
}

